package com.shalanzi.hospital.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.shalanzi.hospital.mapper.UserMapper;
import com.shalanzi.hospital.pojo.User;
import com.shalanzi.hospital.query.UserQuery;
import com.shalanzi.hospital.service.UserService;
import com.shalanzi.hospital.utils.ParamUtil;
import com.shalanzi.hospital.vo.UserModel;
import com.shalanzi.hospital.vo.Welcome;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.DigestUtils;

import javax.annotation.Resource;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author Dream_飞翔
 * @date 2021/9/24
 * @time 21:13
 * @email 1072876976@qq.com
 */
@Service
public class UserServiceImpl implements UserService {
    @Resource
    private UserMapper userMapper;

    /**
     * 获取用户列表
     *
     * @param userQuery 用户提交的参数
     * @return 用户列表集合
     */
    @Override
    public Map<String, Object> getUserList(UserQuery userQuery) {
        // 声明返回前端的Map集合
        Map<String, Object> map = new HashMap<>();

        // 获取分页参数
        int pageNum = userQuery.getPageNum();  // 页号
        int pageSize = userQuery.getPageSize();  // 每页参数

        // 开启分页，参数：1. 当前第几页  2. 每页有多少条数据
        PageHelper.startPage(pageNum, pageSize);
        // 得到对应的分页对象
        PageInfo<User> pageInfo = new PageInfo<>(userMapper.selectByParams(userQuery));

        // 设置Map对象
        map.put("code", 0);
        map.put("msg", "success");
        // 查询到的数量
        map.put("count", pageInfo.getTotal());
        // 设置查询到的分页集合
        map.put("data", pageInfo.getList());
        return map;
    }

    /**
     * 用户登录方法
     *
     * @param userName 用户名称
     * @param password 用户密码
     * @return 用户模块对象
     */
    @Override
    public UserModel userLogin(String userName, String password) {
        // 检验用户参数
        checkLoginParams(userName, password);
        UserModel userModel = new UserModel();
        // 将密码以MD5方式进行加密
        String md5Pass = DigestUtils.md5DigestAsHex(password.getBytes());
        // 构造查询条件
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("user_name", userName);
        // 在数据库进行查询对应用户
        User user = userMapper.selectOne(queryWrapper);

        ParamUtil.isTrue(user == null, "该用户不存在！");

        // 验证登录密码是否正确
        checkPassword(md5Pass, user.getPassword());

        // 设置返回前端的参数
        userModel.setId(user.getId());
        userModel.setNick(user.getNick());

        return userModel;
    }

    /**
     * 通过用户Id查询用户对象
     *
     * @param userId 用户Id
     * @return 用户对象
     */
    @Override
    public User selectUserById(Integer userId) {
        return userMapper.selectById(userId);
    }

    /**
     * 通过用户Id来更新用户对象
     *
     * @param user 前端传来的用户对象
     * @return 受到影响的行数
     */
    @Override
    @Transactional
    public Integer updateUserById(User user) {
        return userMapper.updateById(user);
    }

    /**
     * 新增用户对象
     *
     * @param user 用户提交的用户对象
     * @return 受影响的行数
     */
    @Override
    @Transactional
    public Integer addUserById(User user) {
        // 设置用户的创建时间
        user.setCreatTime(new Date());
        // 设置用户的密码，初始密码为123456
        user.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes()));
        return userMapper.insert(user);
    }

    /**
     * 批量删除用户对象
     *
     * @param ids 用户选择要删除的数组
     * @return 受到影响的行数
     */
    @Override
    public Integer deleteUserByIds(Integer[] ids) {
        return userMapper.deleteUserByIds(ids);
    }

    /**
     * 获取所有的分组
     *
     * @return
     */
    @Override
    public List<Map<String, Object>> queryAllGroups() {
        return userMapper.queryAllGroups();
    }

    /**
     * 查询排班的护士
     *
     * @param userId 用户传来的Id
     * @return 符合条件的护士对象
     */
    @Override
    public User selectClassUserById(Integer userId) {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("id",userId).eq("group_id", 2);
        return userMapper.selectOne(queryWrapper);
    }

    /**
     * 更新排班状态
     *
     * @param user 用户提交的排班状态码
     * @return 受到影响的行数
     */
    @Override
    @Transactional
    public Integer updateUserState(User user) {
        return userMapper.updateById(user);
    }

    /**
     * 查询所有的排班状态
     *
     * @return 符合排班状态的分组集合
     */
    @Override
    public List<Map<String, Object>> queryAllStates() {
        return userMapper.queryAllStates();
    }

    /**
     * 获取到医院总的数据信息
     *
     * @return 医院总数据信息
     */
    @Override
    public Welcome showHospitalData() {
        Welcome welcome = new Welcome();
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        // 获取医院总人数
        Integer rows = userMapper.selectCount(null);
        // 获取管理员总人数
        queryWrapper.eq("group_id", 1);
        Integer managerNum = userMapper.selectCount(queryWrapper);
        // 获取护士总人数
        queryWrapper.clear();
        queryWrapper.eq("group_id", 2);
        Integer nurseNum = userMapper.selectCount(queryWrapper);

        return welcome.setAllPeople(rows).setManager(managerNum).setNurse(nurseNum);
    }

    /**
     * 修改用户密码
     *
     * @param userId  当前用户的Id
     * @param newPassword 用户输入的新密码
     * @param rePassword  用户重复输入的密码
     * @return 受到影响的行数
     */
    @Override
    @Transactional
    public Integer updatePassword(Integer userId, String newPassword, String rePassword) {
        String md5Pass = DigestUtils.md5DigestAsHex(newPassword.getBytes());
        ParamUtil.isTrue(!newPassword.equals(rePassword), "两次输入密码不一致！");
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("id", userId);
        User user = userMapper.selectOne(queryWrapper);
        ParamUtil.isTrue(user.getPassword().equals(md5Pass),"新密码不能与旧密码一致！");
        // 更新用户密码
        user.setPassword(md5Pass);
        return userMapper.updateById(user);
    }

    /**
     * 验证用户密码是否正确
     *
     * @param password  用户输入的密码
     * @param password1 数据库中查询到的密码
     */
    private void checkPassword(String password, String password1) {
        ParamUtil.isTrue(!password.equals(password1), "用户输入密码不正确！");
    }

    /**
     * 检验用户登录参数是否为空
     *
     * @param userName 账号
     * @param password 密码
     */
    private void checkLoginParams(String userName, String password) {
        // 验证登录账号是否为空
        ParamUtil.isTrue(StringUtils.isBlank(userName), "登录账号不能为空！");
        // 验证登录密码是否为空
        ParamUtil.isTrue(StringUtils.isBlank(password), "登录密码不能为空！");
    }
}
